// 1、应用级别的中间件：绑定到app实例上的中间件
// 2、路由级别的中间件：绑定到express.Router()实例上的中间件
// 3、错误级别的中间件：专门用来捕获项目中发生的异常错误，防止项目异常崩溃 格式：function(err,req,res,next())

// 4、Express内置的中间件：
// express.static 快速托管静态资源的内置中间件
// express.json  解析JSON格式的请求体数据（4.16.0版本后用）
// express.urlencoded 解析URL-encoded格式的请求体数据（4.16.0版本后用）

// 5、第三方中间件：有第三方开发出来的中间件

const express = require('express')

const app = express()

// 3、错误级别的中间使用  错误级别的中间必须注册在所有路由之后
app.get('/', (req, res) => {
    throw new Error('服务器内部放生了错误')
    res.send('Home page.')
})
app.use((err, req, res, next) => {
    console.log('发生了错误' + err.message)
    res.send('Error:' + err.message)
})

// 4、express内置的中间件
// 通过express.json()中间件解析json格式的中间件
app.use(express.json())
// 通过express.urlencoded()中间件解析URL-encoded格式的中间件
app.use(express.urlencoded({ extended: false }))

app.get('/user', (req, res) => {
    // 在服务器，可以使用req.body这个属性来接受客户端发送过来的请求体数据
    // 默认情况下，如果不配置解析表单数据的中间件，则req.bod  默认等于undefined
    console.log(res.body)

})



// 5、第三方中间件

// 导入第三方中间件
const parser = require('body-parser')
// 使用app.use()注册中间件
app.use(parser.urlencoded({ extended: false }))

app.get('/other', (req, res) => {
    // 在服务器，可以使用req.body这个属性来接受客户端发送过来的请求体数据
    // 默认情况下，如果不配置解析表单数据的中间件，则req.bod  默认等于undefined
    console.log(res.body)

})



// 启动服务器

app.listen(8080, () => {
    console.log('服务器已启动 http://127.0.0.1:8080')
})
